# schemas.py

from pydantic import BaseModel
from typing import  List,Optional
from datetime import datetime # 导入 datetime
# --- 设备分类 Schemas ---

# 基础模型，包含所有分类共有的属性
class DeviceCategoryBase(BaseModel):
    name: str

# 用于创建新分类时的数据模型
class DeviceCategoryCreate(DeviceCategoryBase):
    pass

# 用于从API读取/返回分类数据时的模型
# 它包含了数据库中的其他字段，如 id
class DeviceCategory(DeviceCategoryBase):
    id: int

    # Pydantic V2 的配置项, 允许模型从 ORM 对象 (如 SQLAlchemy 模型实例) 中读取数据
    class Config:
        from_attributes = True

# --- 设备信息 Schemas ---

# 基础模型
class DeviceBase(BaseModel):
    name: str
    model: Optional[str] = None
    image_url: Optional[str] = None
    remarks: Optional[str] = None

# 创建模型
class DeviceCreate(DeviceBase):
    category_id: int

# 用于API响应的模型
class Device(DeviceBase):
    id: int
    is_reservable: bool
    
    # 关键点：嵌套 Pydantic 模型
    # 当返回一个设备信息时，我们希望它的 'category' 字段能包含完整的分类信息
    # 这将自动实现数据的关联查询和嵌套返回
    category: DeviceCategory

    class Config:
        from_attributes = True

# 用于返回预约信息的基础模型
class ReservationInfo(BaseModel):
    id: int
    start_time: datetime
    end_time: datetime

    class Config:
        from_attributes = True

# 用于创建新预约时，前端需要提交的数据结构
class ReservationCreate(BaseModel):
    device_id: int
    start_time: datetime
    end_time: datetime
    
    contact_name: str
    contact_phone: str
    contact_group: Optional[str] = "无"



# --- 新增: Token 模型 ---
class Token(BaseModel):
    access_token: str
    token_type: str

# --- 新增: 用户登录请求模型 ---
class UserLogin(BaseModel):
    code: str
    name: str
    avatar_url: str

# ---  订单详情模型 ---
# 用于在“我的订单”列表中显示更丰富的设备信息
class ReservationDevice(BaseModel):
    name: str
    model: Optional[str]
    image_url: Optional[str]
    
    class Config:
        from_attributes = True

class ReservationDetail(ReservationInfo):
    device: ReservationDevice
    status: str
    
    contact_name: str
    contact_phone: str
    contact_group: Optional[str]

    class Config:
        from_attributes = True


# --- “开始使用”接口的响应模型 ---
class UsageRecordStart(BaseModel):
    id: int
    actual_start_time: datetime

    class Config:
        from_attributes = True

# ---  “结束使用”接口的请求体模型 ---
class UsageRecordEnd(BaseModel):
    actual_user_name: str
    actual_user_phone: str
    actual_user_group: Optional[str] = "无"
    remarks: Optional[str]

# ---  “进行中订单”列表的响应模型 ---
class OngoingReservation(BaseModel):
    id: int # usage_record 的 id
    actual_start_time: datetime
    reservation: ReservationDetail # 嵌套完整的预约信息

    class Config:
        from_attributes = True

# ---  “全部/历史订单”列表的响应模型 ---
class HistoryUsageRecord(BaseModel):
    # --- usage_records 表的直接字段 ---
    id: int
    actual_start_time: Optional[datetime]
    actual_end_time: Optional[datetime]
    total_minutes_used: Optional[int]
    remarks: Optional[str]

    # 新增：直接从 usage_records 表获取实际使用人信息
    actual_user_name: Optional[str]
    actual_user_phone: Optional[str]
    actual_user_group: Optional[str]

    # --- 关联的 reservation 对象 ---
    # 我们希望它能返回最详细的预约信息
    reservation: ReservationDetail 

    class Config:
        from_attributes = True